package Git2024_5_24;

public class Redis1_1 {
    // 操作系统 Server系统
    /**
     * 1.Windows操作系统
     * 2.Linux操作系统[安卓手机的内核也是Linux]
     *    RetHat 红帽
     *    CentOS -> RockyLinux 8版本 虚拟机17版本
     *    Ubuntu 乌班图
     *    不同点: 装包方式 配置文件位置有所区别
     *
     * 3.Unix操作系统
     *    MacOS(类Unix)
     */
    /**
     * Ctrl + alt 释放鼠标
     * 终端字体放大缩小 放大: ctrl shift + 缩小: ctrl -
     * 清屏: ctrl l
     * 上下箭头: 查看之前使用过的命令
     * 所有Linux命令 一定要用tab键补齐
     *
     * 主目录
     * root用户: /root
     * 非root用户: /home
     *
     * 绝对路径: /root/... - root用户
     *         /home/... - 非root用户
     * 相对路径: 相对当前路径
     *
     * 查看内容: ls
     * 查看所有内容(包含隐藏文件/目录): ls -a
     *
     * 创建目录: mkdir 目录名
     *         mkdir -p 目录名/目录名/ - 递归创建目录
     *
     * 路径切换: cd /root/...
     *         cd /home/...
     *
     * 删除: rm -rf 目录或文件
     *
     * 创建文件: touch 文件名 文件名
     *
     * 编辑文件: gedit 文件名
     *
     * 查看文件: 查看所有内容 cat 文件名
     *         查看文件前n行 head -n 文件名
     *         查看文件尾n行 Tail -n 文件名
     *
     * 关机: init 0
     *
     * 重启: init 6
     */
    //Vim编辑器
    /**
     * vim编辑器
     * 创建文件方式: touch 文件名
     *            直接 vim 文件名 打开终端后 输入内容保存退出即可自动创建新文件
     * 进入vim: vim 文件名
     * 三种模式
     * 1.浏览模式 通过vim进入文件内部 默认为该模式
     *      1.1 行号跳转:
     *          shift g 或 大写模式的 G: 将光标移动至最后一行第一格
     *          gg: 跳转到第一行第一格
     *          nG: 跳转到n行第一格 一般结合命令行模式的 `:set nu` 一起使用
     *      1.2 复制粘贴:
     *          yy 复制光标所在行
     *          p 黏贴
     *          nyy 复制n行内容 p 黏贴
     *      1.3 删除粘贴行:
     *          dd 删除[剪切]光标所在行 -- 可以p粘贴在指定位置
     *          ndd 删除[剪切]n行内容 -- 可以p粘贴在指定位置
     *      1.4 回退:
     *          u: 回退至上一次保存的内容
     * 2.插入模式 按 a(在光标后插入文本)
     *          或 i(在光标前插入文本)
     *          或 o(在当前行的下方插入新行并进入插入模式) 都可以进入插入模式
     * 3.命令行模式 英文模式下 shift + : 进入命令行模式 在终端下方有一行冒号开头的命令行 输入命令即可
     *        3.1 保存/退出:
     *            `:wq` 保存并退出
     *            `:q!` 不保存直接退出
     *            `:w`  只保存不退出
     *        3.2 行号设置:
     *            `:set nu` 文件设置行号 (nu为number缩写)
     *
     * 若退出vim时使用的方法为强行关闭终端 会产生交换文件 该文件为隐藏文件 若要删除该文件:
     *   1.需要先ls -a显示所有文件
     *   2.再找到 .文件名.txt.pwd 文件并进行强制删除 rm -rf .文件名.txt.pwd
     *
     * ctrl s 隐藏内容
     * ctrl q 显示内容
     */
    // Linux复制命令
    /**
     * 复制粘贴文件/目录(而非内容)
     *  cp (copy的缩写)
     *  复制到其他路径: cp 文件名 复制目的路径
     *               cp 文件名 复制目的路径 重命名文件名
     *  复制到当前路径: cp 文件名 文件名.bak (.bak: 备份文件)
     */
    // Linux剪切命令
    /**
     * mv 剪切后原文件不会保留
     * 命令: mv 文件名 剪切目的路径
     */
    // Redis数据库
    /**
     * mySQL(慢) 通常与 Redis(快) 配合使用
     * Redis 用于处理高并发
     * 开源数据库内存数据库 - 速度快
     * mySQL是磁盘存储的 - 速度较慢
     *
     * 高性能的非关系型(NoSQL)数据库 键值(key-value)存储系统
     *  基于磁盘的NoSQL数据库: Redis MongoDB
     * mySQL数据库是关系型(SQL)数据库的一种
     *
     * 缺点:
     * 1.内存消耗大 无法存储大体量的数据
     *      措施: 因此只存储热点数据 用户访问量大的 并发概率高的数据 MySQL数据库用于存储重型数据
     * 2.数据程序重启即会丢失
     *      措施: 数据持久化 - 备份到磁盘 若数据丢失可以从磁盘拷贝
     *
     *
     * MySQL特点:
     * 1.数值类型 1.1 整型 微小整型 小整形 大整形 1.2 浮点型
     *          2.字符类型 定长 变长 Text
     *          3.日期时间类型 日期 日期时间 时间
     * Redis特点:
     * 本质: 5版本之前单线程 5版本之后 核心仍然是单线程 只是扩展了部分多线程内容
     *
     * 1.开源 基于内存且支持持久化
     * 2.高性能的Key-Value的NoSQL数据库
     * 3.支持数据类型多样 字符串String 列表List 散列Hash 集合Set 有序集合sorted Set
     * 4.支持多种编程语言
     */
    /**
     * 应用场景:
     *  缓存经常被用到 或者需要消耗大量资源的内容 通过Redis
     */
    /**
     * 流程:
     * 背景: 用户发送响应时 一般不会直接与SQL型数据库连接 而是与Redis数据库连接
     *      Redis数据库位于SQL型数据库与客户端之间作为桥梁
     * 1.用户第一次发送某请求时 Redis数据库没有该数据 Redis会向更深层次的重型数据库[SQL关系型数据库]请求数据
     * 2.SQL数据库将响应发送给Redis数据库 并要求其将该响应缓存一份 然后由Redis数据库将响应数据(value)传回给用户
     * 3.当其他用户发送相同请求时 Redis会直接调出其缓存的响应数据使用 速度大大加快
     *
     * 问题: 1.若Redis缓存的内容使用率降低 Redis数据库如何清理
     *      2.若深层次的数据库数据更改 Redis数据库如何同步
     * 措施: 1.降低Redis数据库缓存内容的存储时间 如几十秒 将高峰期的相同请求在几十秒内由Redis数据库处理
     *        另外少数用户经由SQL型数据库 此时SQL型数据库的压力并不会太大
     *      2.同步数据也是同理 周期性的更新缓存内容 保证前后数据库内容一致
     */
    /**
     * 附加功能
     * 数据持久化: 将内存数据保存到磁盘中
     * 过期键功能
     */
    /**
     * Linux中通过命令安装redis数据库
     * 1. dnf update -y
     * 2. dnf -y install redis 在线安装redis数据库 需要电脑联网
     */
    /**
     * 服务端命令(ctl: control缩写)
     * 查看Redis数据库状态
     *  systemctl status redis
     *  按q退出查看界面
     * 停止数据库
     *  systemctl stop redis
     * 启动数据库
     *  systemctl start redis
     * 重启数据库
     *  systemctl restart redis
     * 命令行连接mySQL数据库
     *  redis-cli
     * 验证是否连接成功
     *  PING
     *  -看到回复PONG才是连接成功-
     *  -输入exit退回到命令行-
     * 连接数据库
     *  redis-cli -h 数据库服务器IP地址(如localhost 本机地址) -p 6379 -a 密码
     *      [p 端口缩写 a 表示密码 Linux连接Redis数据库时 默认连接端口为6379]
     *      默认端口号: mySQL 默认-3306
     *                MariaDB 默认-3306
     *                myBatis 默认-8080
     *                HTTP 默认-80
     *                HTTPS 默认-443
     *                Redis 默认-6379
     *  rmd中连接数据库: mysql -数据库服务器IP地址 -u用户名 -p密码
     */
    /**
     * Redis数据库是跨平台的 因此也支持Windows中使用 但是与其适配最好的是Linux

     * Windows操作
     * 安装: 官方网站无Windows安装包 需要从github中下载
     * 如何添加环境变量
     *   1.复制指定目录路径
     *   2.在电脑搜索栏搜索环境变量
     *   3.点击编辑系统环境变量图标
     *   4.点击页面右下角的`环境变量..`
     *   5.在系统变量的框中找到path选项
     *   6.点击该选项 再点击编辑
     *   7.点击新建
     *   7.将复制好的路径粘贴进去即可
     */
    /**
     * 备份文件
     * 切换到主目录下 进入etc目录 使用 ls redis*即可查看所有以redis开头的文件或目录
     *  其中:
     *     Redis-sentinel.conf --- redis的哨兵组件
     *     用于实现哨兵机制: 利用高可用性(HA)解决方案监视/保护redis集群,确保其稳定性并对其做自动的故障转移
     *     (sentinel: 哨兵)
     * etc目录下装载着配置文件 redis的配置文件路径为主目录下的 /etc/redis.conf
     * 在编辑配置文件前 最好先备份一份
     * 备份命令:
     *  cp -p 文件名 复制后文件名
     *  其中 -p 可以保证备份时文件权限不会改变 后续恢复时 不会造成权限不足导致无法读写的问题
     *
     * 进入配置文件后 若想修改配置 需要先将该字段的注释符号"#"删除,或在已经生效的配置信息前添加"#"即可
     *  例如 69行 bind 127.0.0.1 - redis数据库默认为只允许本地连接 注释掉之后即实现了支持远程连接的第一步
     *      88行 protected-mode yes 改为 no - redis4.0之后出现的保护模式 默认为开启状态 即只允许本地连接
     *
     *      507行 将注释符`#`删除,利用 requirepass foobared 字段修改密码
     *            将`foobared`字段删除并修改为自定义密码即可
     *            后续访问数据库时需要输入密码访问: redis-cli -a 密码
     */
    /*
        面试题: 说几条常用的Linux命令
          思路 尽量不要用本页笔记所记的命令 - 太基础了
          df命令: 实用工具 用于报告文件系统的磁盘空间使用状况
          ps-aux命令: 查看进程
          kill命令: 杀进程
          Unix中的ifconfig
            -> Linux中的ifconfig
            -> Linux中的ip命令(提供了更强大的网络配置和管理功能。ip 命令更加灵活，可以处理更多的网络配置任务)
          ping命令: 测试网络地址的连通性
          ...
     */
    /**
     * Redis数据库实质上是操作内存 - 操作将永久存储在内存中(自动持久化)

     * Redis五大数据类型 - 命令
     * 前提: Redis中不能建库 而是固定提供了16个库 库名为db0~db15 连接到数据库后默认处在db0库 每个库之间的数据都是隔离的 且没有表结构(非关系型)
     *      Redis中没有数值类型 一切数值类型都归拢到字符串类型中

     * 1.全局命令(不针对于某一个具体类型)
     *  切换库命令: 关键字(不区分大小写): SELECT
     *            SELECT n(表示切换到n库) - 命令行前会有提示,表示已经切换到了第n个库:[n]
     *  查看库中有哪些key: KEYS pattern名称 - (pattern: 表达式)
     *  查看库中所有键(key): KEYS *
     *  模糊查询key: KEYS na* - 类似于mySQL数据库的 LIKE 查询

     *  查看指定key的格式: TYPE key名

     *  删除一个key: DEL key名

     *  清除当前库中所有key: FLUSHDB
     *  0~15所有库的所有key全部清除: FLUSHALL
   了解即可:
     * 缓存穿透: 当Redis中的数据丢失，导致用户请求的数据无法从缓存中获取，大量用户直接涌向底层的SQL型数据库进行查询，
               这可能导致数据库负载过高甚至崩溃。
     * 缓存击穿: 当一个非常热点的数据在缓存过期的同时，大量请求同时到达，这些请求会绕过缓存直接打到数据库上，这种情况称为缓存击穿。
               它与缓存穿透的区别在于，缓存击穿是针对单个热点数据，而缓存穿透可能是随机的多个数据。
     * 缓存雪崩: 如果多个缓存项在同一时刻过期，或者由于其他原因导致大量缓存同时失效，
               此时如果并发请求到来，将直接导致数据库瞬间压力过大，就像雪崩一样，这种现象称为缓存雪崩。
               它可能导致整个服务瘫痪，因为所有请求都转到了数据库层面。

     * 2.字符串
     * SET命令(增):
     *   插入key-value: SET key名 value
     *      过期键功能(sms_表示short message): SET key名 value ex(或expire) n
     *          (其中ex(或expire)为expiration缩写,n表示n秒后过期 - tx n:表示n毫秒后过期)
     *      显示该过期键还有多久过期: TTL key名(若已过期 会显示-2)
     *   SET key名 nx(not exists) 当执行SET命令时key名重复 会覆盖原有key名
     *                            若不想进行覆盖而是判断key是否存在
     *                            若存在便不做任何改变 可使用该命令
     *   MSET(M表示many): MSET key名1 value1 key名2 value2 ... - 设置多对键值对 - 不能设置过期时间

     * GET命令(获取):
     *   GET key名
     *   MGET(M表示many): MGET key名1 value1 key名2 value2 ... - 获取多对键值对

     * 字符串
     *   STRLEN key名 获取字符串长度 (STR_ing LEN_gth)
     * 整型
     *   INCR key名 整型数值+1 (increment 递增)
     *   DECR key名 整型数值-1 (decrement 递减)
     * 浮点型
     *   INCRBYFLOAT key名 n.m 浮点型数值key名+n.m (INCR BY FLOAT)
     *                   -n.m 表示减去n.m
     * 应用场景: 缓存:缓存用户访问量大的热点数据 比如网页首页 热门文章 销量高的商品等
     *         验证码(短信<成本高> 邮箱<省钱>): 添加过期时间
     *         计数操作: 点赞数 评论数 播放量等


     * 3.列表(存放字符串)
     * 应用场景: 消息队列/任务队列 都遵循 First In First Out 先进先出原则队列模型
     *                              Last In First Out 堆栈模型-后进先出
     * 操作头:压入 LPUSH key(如list01) 1 2 3 可存放1个也可存放多个 先压入1,最后压入3 显示顺序为 3 2 1
     * 操作尾:推入 RPUSH key(如list01) 4 5 先推入4 最后推入5 显示顺序为 4 5

     * 查看List(L)元素: LRANGE key(如list01) 0 -1 (-1表示最后一个元素) 即将下标为0的起始元素 到最后一个元素依次显示

     * 从头将元素(任务)弹出: LPOP key(如list01) 将第一个元素弹出
     * 从尾将元素(任务)弹出: RPOP key(如list01) 将从尾开始的第一个元素弹出
     *      BLPOP: (B:block阻塞) BLPOP key(如list01) n 将从头数第一个元素弹出 若无任务会阻塞n秒(n=0表示永久阻塞)
     *      BRPOP: (B:block阻塞) BRPOP key(如list01) n 将从尾数第一个元素弹出 若无任务会阻塞n秒(n=0表示永久阻塞)
     *      先到先服务: 当有多个终端进入阻塞状态时 根据进入阻塞状态的先后执行弹出指令 即先阻塞 先弹出 先解除阻塞

     * 从指定位置插入元素: LINSERT key(如list01) AFTER/BEFORE value newvalue
     * 列表长度(元素个数): LLEN key(如list01)

     * 删除元素: LREM key(如list01) count(若为正数 则从头到尾删除 若为负数 则从尾到头删除) value(删除的信息 若有多个则删除|count|个)

     * 保留指定元素: 从头保留: LRTIM key(如list01) start stop (依据下标,从0开始)
     *            从尾保存: RRTIM key(如list01) start stop

     * 索引值: LSET key(如list01) 索引值(依据下标 从0开始) newValue

     * 4.哈希散列
     * 5.集合
     * 6.有序集合
     */


}
